<?php

namespace System\library;

/**
 * <b>Class</b> :        Curl<br>
 * <b>Fonction</b> :     Permet d'excuter des requete curl
 * <br>
 * @version              1.0
 * @author               Steuf
 * @version              2.0<br>
 *                       Ajout de la phpdoc<br>
 *                       little fix
 * <br>
 * @author               Dread <dreadlokeur@gmail.com>
 * @license              Licence publique générale GNU http://www.gnu.org/licenses/gpl.html
 * @copyright            Copyright 2011 - MidichloriansPHP and contributors
 * @package              System
 * @subpackage           library
 */
class Curl {

    /**
     * L'attribut qui stock l'url
     *
     * @access private
     * @var string
     */
    private $_url = null;
    /**
     * L'attribut qui stock la session cURL
     *
     * @access private
     * @var string
     */
    private $_curl = null;
    /**
     * L'attribut qui stock les "POST" à effectuer dans la requete curl
     *
     * @access private
     * @var string
     */
    private $_post = array();
    /**
     * L'attribut qui stock les "GET" à effectuer dans la requete curl
     *
     * @access private
     * @var string
     */
    private $_get = array();
    /**
     * L'attribut qui stock la reponse de la requete curl
     *
     * @access private
     * @var mixed
     */
    private $_response = false;
    /**
     * L'attribut qui stock le contenu de l'en-tête "User-Agent: " à utiliser dans une requête HTTP
     *
     * @access private
     * @var mixed
     */
    private $_userAgent = false;
    /**
     * L'attribut qui stock si on l'on doit encoder en url les options GET et/ou POST
     *
     * @access private
     * @var bool
     */
    private $_encodeParameter = false;

    /**
     * Constructeur: permet de définir l'url de la requete curl, et d'obtenir la session curl
     *
     * @access public
     * @param string $url l'url de la requete curl
     * @return void
     */
    public function __construct($url) {
        if (!extension_loaded('curl'))
            throw new \Exception('Curl extension not loaded try change your PHP configuration');

        $this->_url = $url;
        $this->_curl = curl_init();
    }

    /**
     * Permet d'ajouter un "POST" à la requete curl lors d'une opération de HTTP POST
     *
     * @access public
     * @param string $key la clé du POST
     * @param string $value la valeur de la clé POST
     * @return void
     */
    public function addPost($key, $value) {
        if ($this->_encodeParameter)
            $value = urlencode($value);
        $this->_post[$key] = $value;
    }

    /**
     * Permet d'ajouter un "GET" à la requete curl lors d'une opération de HTTP GET
     *
     * @access public
     * @param string $key la clé du GET
     * @param string $value la valeur de la clé GET
     * @return void>
     */
    public function addGet($key, $value) {
        if ($this->_encodeParameter)
            $value = urlencode($value);
        $this->_get[$key] = $value;
    }

    /**
     * Permet excuter la requete curl, avec les différentes options au préalable définits
     *
     * @access public
     * @param void
     * @return void
     */
    public function execute() {
        curl_setopt($this->_curl, CURLOPT_URL, $this->_url . $this->getGet());
        if ($this->_userAgent)
            curl_setopt($this->_curl, CURLOPT_USERAGENT, $this->_userAgent);
        curl_setopt($this->_curl, CURLOPT_HEADER, false);
        curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($this->_curl, CURLOPT_POST, 1);
        curl_setopt($this->_curl, CURLOPT_POSTFIELDS, $this->getPost());
        $this->_response = curl_exec($this->_curl);
    }

    /**
     * Permet de retourner la reponse de l'excution de la requete curl
     *
     * @access public
     * @param void
     * @return bool $this->response true en cas de succès, false en cas d'erreur
     */
    public function response() {
        return $this->_response;
    }

    /**
     * Permet de retourner tout les options "POST" qui ont été définits
     *
     * @access public
     * @param void
     * @return string trim($post,'&'): tout les key et valeurs des options POST définit
     */
    private function getPost() {
        $post = '';
        foreach ($this->_post as $k => $v)
            $post .= $k . '=' . $v . '&';
        return trim($post, '&');
    }

    /**
     * Permet de retourner tout les options "GET" qui ont été définits
     *
     * @access public
     * @param void
     * @return string trim($post,'&') tout les key et valeurs des options GET définit
     */
    public function getGet() {
        if (count($this->_get) > 0)
            $get = '?';
        else
            $get = '';

        foreach ($this->_get as $k => $v)
            $get .= $k . '=' . $v . '&';
        return trim($get, '&');
    }

    /**
     * Permet de définir une valeur à l'user-agent curl
     *
     * @access public
     * @param string $agent la valeur de définition de l'user agent
     * @return void
     */
    public function setUserAgent($agent) {
        $this->_userAgent = $agent;
    }

    /**
     * Permet de définir si l'on veut encoder en url les options POST et/ou GET de la requete curl
     *
     * @access public
     * @param string $bool true = urlencode() les options POST et/ou GET, ou false
     * @return void
     */
    public function setEncodeParameter($bool) {
        if (!is_bool($bool))
            throw new \Exception('Encode parameter must be an boolean');
        $this->_encodeParameter = $bool;
    }

}

?>